package com.example.module_motocircle.http
import com.example.lib_net.NetModule
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import javax.inject.Qualifier
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object MotorCircleNetModule {

    @Provides
    @Singleton
    @CommonMainApi
    // @NetModule.CommonRetrofit
    //表示这个 Retrofit 实例来自另一个模块（NetModule）的
    // @CommonRetrofit 注解标记的提供方法。
    fun provideMainApi(@NetModule.CommonRetrofit retrofit: Retrofit):MotorCircleApi{
        return retrofit.create(MotorCircleApi::class.java)
    }
    //在依赖注入（如 Hilt/Dagger）体系中，直接调用 @Provides 方法
    // （如 provideMainApi()）是不允许的，
    // 而是通过 注解标记（Qualifier)来间接获取实例。
    // 这是依赖注入的核心设计原则之一

    @Provides
    @Singleton
    @SignMainApi
    fun provideSignMainApi(@NetModule.SignRetrofit retrofit: Retrofit):MotorCircleApi{
        return retrofit.create(MotorCircleApi::class.java)
    }

    @Qualifier//用于区分相同类型（MotorCircleApi）的不同实例
    @Retention(AnnotationRetention.RUNTIME)
    annotation class CommonMainApi


    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class SignMainApi


}
/*
为什么注解能关联到 provideMainApi()？
Hilt/Dagger 通过以下规则匹配：

类型匹配：查找返回类型为 MotorCircleApi 的 @Provides 方法。
注解匹配：如果存在 Qualifier 注解（如 @CommonMainApi），则选择对应注解的方法。
作用域匹配：检查 @Singleton 等作用域注解是否一致。
因此，当你使用 @CommonMainApi 注解时，Hilt 会自动找到 @CommonMainApi 标记的 provideMainApi() 方法
 */